package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	_ "myweb/web/test2"
	"time"
)

/* 用户 table_name = user */
type Student struct {
	//Id   int // 成为默认的主键 -- 主键索引，查询速度快
	gorm.Model
	Name  string `gorm:"size:110;default:'xiaoming'"` // string --- varchar,默认大小255,可以在创建表时，指定大小
	Age   int
	Class int       `gorm:"not null;default:44"`
	Join  time.Time `gorm:"type:datetime"`
}

var GormDB *gorm.DB

func main() {
	fmt.Println("------gormTest------------")

	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	// dialector 配置mysql驱动 配置gorm
	GormDB, err := gorm.Open(mysql.New(mysql.Config{
		// parseTime 转化时间类型为time.Time loc设置当地时间
		DSN:               dsn,
		DefaultStringSize: 190,
	}), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			//TablePrefix:   "t_", // 表名前缀
			SingularTable: true, // 单数表名
		},
		//DisableForeignKeyConstraintWhenMigrating: true,
	})
	if err != nil {
		fmt.Println("数据库连接失败")
		return
	}

	// gorm的数据库对象转为 sql的数据库对象 gorm 使用sql包的对象来维护连接池
	sqlDB, _ := GormDB.DB()
	// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
	sqlDB.SetMaxIdleConns(20)
	// SetMaxOpenConns sets the maximum number of open connections to the database.
	sqlDB.SetMaxOpenConns(100)
	// SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
	sqlDB.SetConnMaxLifetime(time.Hour)

	// 连接测试
	err = sqlDB.Ping()
	if err != nil {
		fmt.Println("数据库打开失败")
		return
	}
	defer sqlDB.Close()
	fmt.Println("数据库连接成功")

	// 借助gorm创建数据库表
	err = GormDB.AutoMigrate(new(Student))
	if err != nil {
		fmt.Println("对象迁移数据库表失败")
		return
	}
	fmt.Println("对象迁移数据库表成功")

	// 测试插入数据
	res := GormDB.Create(&Student{Name: "Pink", Age: 20})
	err = res.Error
	if err != nil {
		fmt.Println("数据插入失败")
	}

	fmt.Println("数据插入成功", res.RowsAffected)

	// 查询数据
	//var stu []Student
	//GormDB.First(&stu) //查询第一条全部信息
	//GormDB.Select("name", "age").First(&stu)
	//GormDB.Unscoped().Find(&stu) // 查询所有
	//GormDB.Select("name, age").Where("name = ?", "CC").Find(&stu)
	//GormDB.Select("name,age").Where("name = ?", "Pink").Where("age = ?", 20).Find(&stu)
	//GormDB.Select("name,age").Where("name = ? and age = ?", "Pink", 20).Find(&stu)
	//fmt.Println(stu)

	// 更新数据
	//GormDB.Model(new(Student)).Where("name=?", "XXX").Update("name", "Pink")
	// 更新多个数据
	//GormDB.Model(new(Student)).Where("name=?", "Pink").Updates(map[string]interface{}{"name": "test", "age": 66})

	// 删除数据
	//GormDB.Unscoped().Where("name", "Pink").Delete(new(Student))
}

func InsertData() {
	var stu Student
	stu.Name = "CC"
	stu.Age = 18

	res := GormDB.Create(&stu)
	err := res.Error
	if err != nil {
		fmt.Println("数据插入失败")
	}

	fmt.Println("数据插入成功", res.RowsAffected)
}
